home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / dolmorph / src / image.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-23  |  7.1 KB  |  283 lines

  1. /*===========================================
  2.           DolphMorph(ドルフモーフ)
  3.  
  4.       モーフィング&変形アニメ作成ソフト
  5.  
  6.   モーフィングアルゴリズム: EAST 1994
  7.   インターフェース作成:     松内 良介 1994
  8. ===========================================*/
  9. #if 0
  10.     image.c
  11.  
  12.     IMAGE    *image_new(int width, int height)
  13.     void    image_delete(IMAGE *im)
  14.     IMAGE    *image_copy(IMAGE *im)
  15.     int     image_loadTIFF(IMAGE *im, char *filename)
  16.     int        image_saveTIFF(IMAGE *im, char *filename)
  17.     IMAGE    *image_createloadTIFF(char *filename)
  18.     void    image_zoomdown(IMAGE *dest, IMAGE *src)
  19.     void    image_zoomdownDark(IMAGE *dest, IMAGE *src, int bDark)
  20.     void    image_getDispSize(IMAGE *im,int maxwid,int maxht,int *wid,int *ht)
  21.     void    image_disp(IMAGE *im, int x, int y, int width, int height)
  22.     void    image_dumpout(IMAGE *im, char *filename)
  23. #endif
  24.  
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #include <winb.h>
  29. #include <te.h>
  30. #include <fntb.h>
  31. #include <gui.h>
  32. #include <egb.h>
  33. #include <wgb.h>
  34. #include <msdos.cf>
  35.  
  36. #include <ryosuke.h>
  37. #include <usrlib.h>
  38.  
  39. #include "morph.h"
  40. #include "points.h"
  41. #include "egbmac.h"
  42. #include "wgbmac.h"
  43. #include "guisub.h"
  44. #include "image.h"
  45.  
  46. IMAGE    *image_new(int width, int height)
  47. {
  48.     IMAGE *pi;
  49.     if ((pi = TL_calloc(1,sizeof(IMAGE))) == NULL)
  50.         return NULL;
  51.     if ((pi->image = TL_calloc(2,width * height)) == NULL)
  52.         { TL_free(pi);  return NULL; }
  53.     pi->width = width;
  54.     pi->height = height;
  55.     pi->virwid = width;
  56.     pi->virht = height;
  57.     return pi;
  58. }
  59.  
  60. void    image_delete(IMAGE *im)
  61. {
  62.     TL_free(im->image);
  63.     TL_free(im);
  64. }
  65.  
  66. IMAGE    *image_copy(IMAGE *im)
  67. {
  68.     IMAGE *pi;
  69.     if ((pi = TL_calloc(1,sizeof(IMAGE))) == NULL)
  70.         return NULL;
  71.     pi->width  = im->width;
  72.     pi->height = im->height;
  73.     pi->virwid = im->virwid;
  74.     pi->virht  = im->virht;
  75.     if ((pi->image = TL_calloc(2,im->width * im->height)) == NULL)
  76.         { TL_free(pi);  return NULL; }
  77.     memcpy(pi->image, im->image, 2 * im->width * im->height);
  78.     return pi;
  79. }
  80.  
  81.     static IMAGE *_pi;
  82.     static TIFFinfo tiffinfo;
  83.  
  84.     static int putimage(char *buf, int yofs, int ylen)
  85.     {
  86.         int i;
  87.         for (i=0; i<ylen; i++)
  88.         {
  89.             memcpy( _pi->image + (_pi->width*2)*(yofs+i),
  90.                     buf + (tiffinfo.xlen*2)*i,
  91.                     _min(_pi->width,tiffinfo.xlen)*2 );
  92.         }
  93.         return 0;
  94.     }
  95.  
  96. int image_loadTIFF(IMAGE *im, char *filename)
  97. {
  98.     _pi = im;
  99.     if (TIFFgetinfo(filename, &tiffinfo) != 0)
  100.         return -1;
  101.     TIFFload_putimagefunc(putimage);
  102.     im->virwid = _min(im->width,  tiffinfo.xlen);
  103.     im->virht  = _min(im->height, tiffinfo.ylen);
  104.     return TIFFload(filename,0,0);
  105. }
  106.  
  107.     static int getimage(char *buf, int yofs, int ylen)
  108.     {
  109.         int i;
  110.         for (i=0; i<ylen; i++)
  111.         {
  112.             memcpy( buf + (_pi->width*2)*i,
  113.                     _pi->image + (_pi->width*2)*(yofs+i),
  114.                     _pi->width*2 );
  115.         }
  116.         return 0;
  117.     }
  118.  
  119. int image_saveTIFF(IMAGE *im, char *filename)
  120. {
  121.     _pi = im;
  122.     EGB_writePage(guiEgbPtr, 1);
  123.     TIFFsave_getimagefunc(getimage);
  124.     int ret;
  125.     if ((ret = TIFFsave(filename,0,0,im->width,im->height,1)) != 0)
  126.     {
  127.         if (ret == -1)
  128.             return ERROR_CANNOTOPEN;
  129.         else if (ret == -2)
  130.             return ERROR_NOMEMORY;
  131.         else if (ret == -3)
  132.             return ERROR_DISKFULL;
  133.         else if (ret == -4)
  134.             return ERROR_OTHER;
  135.     }
  136.     EGB_writePage(guiEgbPtr, 0);
  137.     return 0;
  138. }
  139.  
  140. int image_createloadTIFF(IMAGE **ppi, char *filename)
  141. {
  142.     IMAGE *im;
  143.     int ret;
  144.     if ((ret = TIFFgetinfo(filename, &tiffinfo)) != 0)
  145.     {
  146.         if (ret == -1)       return ERROR_CANNOTOPEN;
  147.         else if (ret == -2)  return ERROR_INVALIDFORMAT;
  148.         else                 return ERROR_NOMEMORY;
  149.     }
  150.     if (tiffinfo.pixelsize != MORPH_PIXELSIZE)
  151.         return ERROR_INVALIDPIXELSIZE;
  152.     if ((im = image_new(tiffinfo.xlen, tiffinfo.ylen)) == NULL)
  153.         return ERROR_NOMEMORY;
  154.     _pi = im;
  155.     im->virwid = tiffinfo.xlen;
  156.     im->virht  = tiffinfo.ylen;
  157.     TIFFload_putimagefunc(putimage);
  158.     TIFFload(filename,0,0);
  159.     *ppi = im;
  160.     return 0;
  161. }
  162.  
  163. static void image_calcZoomParm(IMAGE *im, int maxwid,int maxht,
  164.                                int *r, int *wid, int *ht)
  165. /* ある画像を特定の大きさに縮小したとき、その縮小比と縦横サイズを求める */
  166. {
  167.   /* 縮小率を計算 */
  168.     int    _r,r1,r2;
  169.     r1 = (im->width  << 16) / maxwid;
  170.     r2 = (im->height << 16) / maxht;
  171.     _r = _max(r1,r2);
  172.   /* 縮小後の縦横のサイズを計算 */
  173.     int _wid, _ht;
  174.     if (im->width * maxht > maxwid * im->height)
  175.         _wid = maxwid, _ht = (im->height << 16) / _r;    /* 元画像が横長 */
  176.     else
  177.         _wid = (im->width << 16) / _r, _ht = maxht;        /* 元画像が縦長 */
  178.   /* 計算結果を格納 */
  179.     if (r != NULL)
  180.         *r = _r;
  181.     if (wid != NULL)
  182.         *wid = _wid;
  183.     if (ht != NULL)
  184.         *ht = _ht;
  185. }
  186.  
  187. void image_zoomdown(IMAGE *dest, IMAGE *src)
  188. {
  189.     int dx2,dy2,i,j;
  190.     memset(dest->image, 0, dest->width*dest->height*2);
  191.   /* 縮小率と、縮小後の画像サイズを計算 */
  192.     int r,wid,ht;
  193.     image_calcZoomParm(src,dest->width,dest->height, &r,&wid,&ht);
  194.   /* 縮小転送 */
  195.     int sx,sy,dx,dy;
  196.     unsigned short *dp,*sp;
  197.     for (dy=0,sy=0; dy < ht; dy++,sy+=r)
  198.     {
  199.         dp = &((unsigned short *)dest->image)[dest->width * dy];
  200.         sp = &((unsigned short *)src->image)[src->width * ((sy+0x8000)>>16)];
  201.         for (dx=0,sx=0; dx < wid; dx++,sx+=r)
  202.             dp[dx] = sp[(sx+0x8000) >> 16];
  203.     }
  204.     dest->virwid = wid;
  205.     dest->virht  = ht;
  206. }
  207.  
  208. void image_zoomdownDark(IMAGE *dest, IMAGE *src, int bDark)
  209. {
  210.     int dx2,dy2,i,j;
  211.     memset(dest->image, 0, dest->width*dest->height*2);
  212.   /* 縮小率と、縮小後の画像サイズを計算 */
  213.     int r,wid,ht;
  214.     image_calcZoomParm(src,dest->width,dest->height, &r,&wid,&ht);
  215.   /* 縮小転送 */
  216.     int sx,sy,dx,dy;
  217.     unsigned short *dp,*sp;
  218.     for (dy=0,sy=0; dy < ht; dy++,sy+=r)
  219.     {
  220.         dp = &((unsigned short *)dest->image)[dest->width * dy];
  221.         sp = &((unsigned short *)src->image)[src->width * ((sy+0x8000)>>16)];
  222.         if (!bDark)
  223.         {
  224.             for (dx=0,sx=0; dx < wid; dx++,sx+=r)
  225.                 dp[dx] = sp[(sx+0x8000) >> 16];
  226.         }
  227.         else
  228.         {
  229.             for (dx=0,sx=0; dx < wid; dx++,sx+=r)
  230.                 dp[dx] = (sp[(sx+0x8000) >> 16] >> 1) & (15|(15<<5)|(15<<10));
  231.         }
  232.     }
  233.     dest->virwid = wid;
  234.     dest->virht  = ht;
  235. }
  236.  
  237. void    image_getDispSize(IMAGE *im,int maxwid,int maxht,int *wid,int *ht)
  238. /* im:表示のオリジナルとなる画像(or NULL) */
  239. {
  240.     if (im == NULL)
  241.         { *wid = *ht = 0;  return; }
  242.   /* 縮小後の画像サイズを計算 */
  243.     int _wid,_ht;
  244.     image_calcZoomParm(im,(maxwid+1)/2,(maxht+1)/2, NULL,&_wid,&_ht);
  245.     if (wid != NULL)
  246.         *wid = _wid * 2;
  247.     if (ht != NULL)
  248.         *ht = _ht * 2;
  249. }
  250.  
  251. void image_disp(IMAGE *im, int x, int y, int width, int height)
  252. {
  253.     RM_setOriginZero();
  254.     if (im == NULL)
  255.     {
  256.         WGB_RBOXFILL(guiEgbPtr, x,y,width,height,WINBACK, 0);
  257.         goto END;
  258.     }
  259.     WGB_RBOXFILL(guiEgbPtr, x,y,im->virwid*2,im->virht*2,0, 0);
  260.     int marginWid, marginHt;
  261.     marginWid = width - im->virwid*2;
  262.     marginHt =  height - im->virht*2;
  263.     if (marginWid > 0)
  264.         WGB_RBOXFILL(guiEgbPtr, x+im->virwid*2,y,marginWid,height,WINBACK,0);
  265.     if (marginHt > 0)
  266.         WGB_RBOXFILL(guiEgbPtr, x,y+im->virht*2,width,marginHt,WINBACK, 0);
  267.     RM_putblock32k(im->image, x/2, y/2, im->width, im->height);
  268.    END:;
  269.     RM_recoverOrigin();
  270. }
  271.  
  272. void image_dumpout(IMAGE *im, char *filename)
  273. /* デバッグのために画像データをベタ出力 */
  274. {
  275.     // printf("image_dumpout: [%s](%d,%d)\n", filename,im->width, im->height);
  276.     FILE *fp;
  277.     if ((fp = fopen(filename, "wb")) != NULL)
  278.     {
  279.         fwrite(im->image,2,im->width * im->height,fp);
  280.         fclose(fp);
  281.     }
  282. }
  283.